/*
 * ADS1292.c
 *
 *  Created on: Jun 17, 2024
 *      Author: 17850
 */

#include "ADS1292.h"
#include "Delay.h"
#include "spi.h"
#include "usart.h"


void GPIO_ADS1292_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStruct ={0};

  // 使能IO口时钟
  __HAL_RCC_GPIOC_CLK_ENABLE();


	// ADS1292_DRDY -> PA3
//	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3;					// 配置ADS1292_DRDY
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		// 高速
//  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;			// 上拉输入
//  GPIO_Init(GPIOA, &GPIO_InitStructure);							// 初始化

	// ADS1292_PWDN  -> PA0
	// ADS1292_START -> PA1
  // ADS1292_CS  	 -> PA2
  GPIO_InitStruct.Pin       = GPIO_PIN_3 | GPIO_PIN_4;
  GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;      // 推挽输出
  GPIO_InitStruct.Pull      = GPIO_NOPULL;              // 不上拉也不下拉
  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_LOW;      // 选择合适的速度，根据STM32L4的参考手册
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);               // 初始化GPIOC

  __HAL_RCC_GPIOB_CLK_ENABLE();

  GPIO_InitStruct.Pin       = GPIO_PIN_5;
  GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;      // 推挽输出
  GPIO_InitStruct.Pull      = GPIO_NOPULL;              // 不上拉也不下拉
  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_LOW;      // 选择合适的速度，根据STM32L4的参考手册
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);               // 初始化GPIOC
}

void ADS1292_Write_Reg(uint8_t addr, uint8_t data)
{
	CS_L;				// 片选拉低
	Delay_1us(10);
	SPI3_ReadWriteByte(addr);	// 包含命令操作码和寄存器地址
	Delay_1us(10);
	SPI3_ReadWriteByte(0x00);	// 要读取的寄存器数+1
	Delay_1us(10);
	SPI3_ReadWriteByte(data);	// 写入的数据
	Delay_1us(10);
	CS_H;				// 片选置高
}
/*void ADS1292_Write_Reg(uint8_t addr, uint8_t data)
{
    uint8_t cmd = addr;       // 组成命令操作码和寄存器地址
    uint8_t reg_count = 0x00; // 要读取的寄存器数+1

    CS_L;  // 片选拉低
    HAL_SPI_Transmit(&hspi3, &cmd, 1, HAL_MAX_DELAY);  // 发送命令操作码和寄存器地址
    Delay_1us(10);  // 延时1ms，这里适应HAL库没有微秒延时函数，用1ms延时代替
    HAL_SPI_Transmit(&hspi3, &reg_count, 1, HAL_MAX_DELAY);  // 发送寄存器数
    Delay_1us(10);  // 延时1ms
    HAL_SPI_Transmit(&hspi3, &data, 1, HAL_MAX_DELAY);  // 发送数据
    Delay_1us(10); // 延时1ms
    CS_H;  // 片选置高
}*/

uint8_t ADS1292_Read_Reg(uint8_t addr)
{
	uint8_t Rxdata;
	CS_L;					// 片选拉低
	SPI3_ReadWriteByte(addr); 			// 包含命令操作码和寄存器地址
	Delay_1us(10);
	SPI3_ReadWriteByte(0x00); 			// 要读取的寄存器数+1
	Delay_1us(10);
	Rxdata = SPI3_ReadWriteByte(0xFF); 	// 读取的数据
	Delay_1us(10);
	CS_H;					// 片选置高
  return Rxdata;
}
/*uint8_t ADS1292_Read_Reg(uint8_t addr)
{
    uint8_t cmd = addr;       // 组成命令操作码和寄存器地址
    uint8_t reg_count = 0x00; // 要读取的寄存器数+1
    uint8_t Rxdata = 0xFF;    // 读取的数据占位符

    CS_L;  // 片选拉低

    // 发送命令操作码和寄存器地址
    HAL_SPI_Transmit(&hspi3, &cmd, 1, HAL_MAX_DELAY);
    Delay_1us(10);  // 延时1ms，这里适应HAL库没有微秒延时函数，用1ms延时代替

    // 发送寄存器数
    HAL_SPI_Transmit(&hspi3, &reg_count, 1, HAL_MAX_DELAY);
    Delay_1us(10);  // 延时1ms

    // 读取数据
    HAL_SPI_Receive(&hspi3, &Rxdata, 1, HAL_MAX_DELAY);
    Delay_1us(10);  // 延时1ms

    CS_H;  // 片选置高

    return Rxdata;
}*/


void ADS1292_PowerOnInit(void)
{
	uint8_t device_id;

	START_H;
	CS_H;
	PWDN_L; // 进入掉电模式
	Delay_50ms(20);
	PWDN_H; // 退出掉电模式
	Delay_50ms(20);   // 等待稳定
	PWDN_L; // 发出复位脉冲
	Delay_1us(10);
  	PWDN_H;
  	Delay_50ms(20); // 等待稳定，可以开始使用ADS1292R

	START_L;
	CS_L;
	Delay_1us(10);

	printf("SPI3_ReadWriteByte(SDATAC)\r\n");
	SPI3_ReadWriteByte(SDATAC); // 发送停止连续读取数据命令
	Delay_1us(10);
	CS_H;

	// 获取芯片ID
	printf("read chip ID\n");
	device_id = ADS1292_Read_Reg(RREG | ID);


	while(device_id != 0x73)
	{
		printf("ERROR ID:%02x\r\n",device_id);
		device_id = ADS1292_Read_Reg(RREG | ID);
		Delay_50ms(20);
	}


	Delay_1us(10);

	ADS1292_Write_Reg(WREG | CONFIG2,  0XE0); // 使用内部参考电压 0100 0000 | 0000 0010 = 0100 0010 E0

 	Delay_1ms(10);                           // 等待内部参考电压稳定



	ADS1292_Write_Reg(WREG | CONFIG1,  0X01); // 设置转换速率为250SPS


	Delay_1us(10);

	ADS1292_Write_Reg(WREG | LOFF,     0XF0);	// 该寄存器配置引出检测操作



	Delay_1us(10);


	ADS1292_Write_Reg(WREG | CH1SET,   0X60); // 增益12，连接到电极
	Delay_1us(10);



	ADS1292_Write_Reg(WREG | CH2SET,   0X00); // 增益6，连接到电极
	Delay_1us(10);



	ADS1292_Write_Reg(WREG | RLD_SENS, 0xEF);
	Delay_1us(10);



	ADS1292_Write_Reg(WREG | LOFF_SENS,0x0F);



	Delay_1us(10);
	ADS1292_Write_Reg(WREG | LOFF_STAT,0x00);
	Delay_1us(10);

	ADS1292_Write_Reg(WREG | RESP1,    0xEA); // 开启呼吸检测（ADS1292R特有）
	Delay_1us(10);


	ADS1292_Write_Reg(WREG | RESP2,    0x03);//03
	Delay_1us(10);

	ADS1292_Write_Reg(WREG | GPIO,     0x0C);
  	Delay_1us(10);

  	printf("onpower finished\r\n");

}

void ADS1292_Read_Data(uint8_t *data)
{
	uint8_t i;
	CS_L;
	Delay_1us(10);
	SPI3_ReadWriteByte(RDATAC);		// 发送启动连续读取数据命令
	Delay_1us(10);
	CS_H;
	START_H; 				// 启动转换
	while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4) == 1);	// 等待DRDY信号拉低
	CS_L;
	Delay_1us(10);
	for (i = 0; i < 9; i++)		// 连续读取9个数据
	{
		*data = SPI3_ReadWriteByte(0xFF);
		data++;
	}
	START_L;				// 停止转换
	SPI3_ReadWriteByte(SDATAC);		// 发送停止连续读取数据命令
	Delay_1us(10);
	CS_H;
}
